﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Util;
using RegraNegocio;
using System.Text;

namespace PedidoWeb
{
    public partial class Pedido : System.Web.UI.Page
    {
        private static int CADASTRAR = 0;
        private static int CONSULTAR = 1;
        private Model.Pedido pedido = null;
        private List<ItemPedidoVO> produtosSelecionados = null;

        public Pedido() 
        {
            produtosSelecionados = new List<ItemPedidoVO>();
        }

        private void populaComboBoxCliente()
        {
            List<Model.Cliente> clientesCadastrados = ClienteBO.getInstance().recuperarTodosClientes();

            cmbCliente.DataSource = clientesCadastrados;
            cmbCliente.DataValueField = "codigo";
            cmbCliente.DataTextField = "nome";
            cmbCliente.DataBind();
        }

        private void populaComboBoxProduto()
        {
            List<Model.Produto> produtosCadastrados = ProdutoBO.getInstance().recuperarTodosProdutos();

            cmbProduto.DataSource = produtosCadastrados;
            cmbProduto.DataValueField = "codigo";
            cmbProduto.DataTextField = "nome";
            cmbProduto.DataBind();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack) {
                this.populaComboBoxCliente();
                this.populaComboBoxProduto();
                
            }
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {
            String quantidade = txtQuantidade.Text;
            ItemPedidoVO auxiliar = null;

            if (cmbProduto.SelectedIndex <= 0 && quantidade.Equals(string.Empty))
            {
                this.adicionarMensagem("Favor verificar o preenchimento dos campos Produto e Quantidade.");

                return;
            }

            if (Util.Util.getInstance().isInteiro(quantidade))
            {
                int codigoProduto = int.Parse(cmbProduto.SelectedValue);

                if (ProdutoBO.getInstance().verificarRetiradaEstoque(codigoProduto, int.Parse(quantidade)))
                {
                    if (!ItemPedidoBO.getInstance().hasItemPedido(produtosSelecionados, codigoProduto))
                    {
                        auxiliar = new ItemPedidoVO();

                        List<ItemPedidoVO> itens = (List<ItemPedidoVO>)dtgProdutos.DataSource;

                        auxiliar.CodigoProduto = codigoProduto;
                        auxiliar.NomeProduto = cmbProduto.SelectedItem.Text;
                        auxiliar.Quantidade = int.Parse(quantidade);

                        if (itens == null) { itens = new List<ItemPedidoVO>(); } 
                        
                        itens.Add(auxiliar);

                        dtgProdutos.DataSource = null;
                        dtgProdutos.DataSource = itens;
                        dtgProdutos.DataBind();

                        txtQuantidade.Text = string.Empty;
                    }
                    else
                    {
                        this.adicionarMensagem("O item escolhido já foi adicionado a lista!");
                    }
                }
                else
                {
                    this.adicionarMensagem("A quantidade de produtos selecionada é maior que a quantidade que consta em estoque.");
                }
            }
            else
            {
                this.adicionarMensagem("O campo Quantidade deve ser preenchido com valores numéricos.");
            }

        }

        private void adicionarMensagem(string mensagem) 
        {
            lblMensagem.Text = mensagem;
            lblMensagem.Visible = true;
        }

        private void camposHabilitadosCadastrar()
        {
            this.lblCodigo.Visible = false;
            this.txtCodigo.Visible = false;

            this.txtDescricao.Enabled = true;
            this.txtData.Enabled = true;
            this.txtDesconto.Enabled = true;
            this.txtOrcamento.Enabled = true;
            this.txtQuantidade.Enabled = true;
            this.cmbProduto.Enabled = true;
            this.cmbCliente.Enabled = true;

            this.btnAdicionar.Enabled = true;
            this.dtgProdutos.Enabled = true;

            this.lblValorTotal.Visible = false;
            this.lblResultado.Visible = false;

        }

        private void camposHabilitadosConsultar()
        {
            this.lblCodigo.Visible = true;
            this.txtCodigo.Visible = true;

            this.txtDescricao.Enabled = false;
            this.txtData.Enabled = false;
            this.txtDesconto.Enabled = false;
            this.txtOrcamento.Enabled = false;
            this.txtQuantidade.Enabled = false;
            this.cmbProduto.Enabled = false;
            this.cmbCliente.Enabled = false;

            this.lblValorTotal.Visible = false;
            this.lblResultado.Visible = false;

            this.btnAdicionar.Enabled = false;
        }

        protected void cmbAcao_SelectedIndexChanged(object sender, EventArgs e)
        {
            int acaoSelecionada = cmbAcao.SelectedIndex;
            this.limparCampos();

            if (acaoSelecionada == CADASTRAR)
            {
                this.camposHabilitadosCadastrar();

                this.btnCadastrar.Text = "Cadastrar";
            }
            else if (acaoSelecionada == CONSULTAR)
            {
                this.camposHabilitadosConsultar();

                this.btnCadastrar.Text = "Consultar";
            }
            else
            {
                this.camposHabilitadosConsultar();

                this.btnCadastrar.Text = "Excluir";
            }

        }

        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            pedido = new Model.Pedido();
            String acao = btnCadastrar.Text;

            if (acao.Equals("Cadastrar"))
            {
                List<String> erros = this.validaCamposForm();

                if (erros.Any())
                {
                    StringBuilder mensagemErro = new StringBuilder();
                    foreach (var erro in erros)
                    {
                        mensagemErro.Append(erro + "<br />");
                    }

                    this.adicionarMensagem(mensagemErro.ToString());
                    return;
                }
                else
                {
                    if (!Util.Util.getInstance().isDecimal(txtDesconto.Text))
                    {
                        this.adicionarMensagem("O campo desconto deve ser preenchido com números!");

                        return;
                    }

                    if (!Util.Util.getInstance().isDate(txtData.Text))
                    {
                        this.adicionarMensagem("O campo data deve ser preenchido no formato dd/MM/yyyy!");
                        return;
                    }

                    List<ItemPedidoVO> itens = (List<ItemPedidoVO>)dtgProdutos.DataSource;

                    if (itens.Any())
                    {
                        pedido.Descricao = txtDescricao.Text;
                        pedido.Data = Util.Util.getInstance().convertToDate(txtData.Text);
                        pedido.Orcamento = txtOrcamento.Text;
                        pedido.ValorDesconto = decimal.Parse(txtDesconto.Text);
                        pedido.Cliente = new Model.Cliente(int.Parse(cmbCliente.SelectedValue.ToString()));
                        try
                        {
                            PedidoBO.getInstance().inserirPedido(pedido, ItemPedidoBO.getInstance().convertToItemPedido(itens));

                            this.adicionarMensagem("Sucesso na inserção do pedido!");

                            this.limparCampos();
                        }
                        catch (Exception cause)
                        {
                            this.adicionarMensagem("Problema na inserção do pedido: " + cause.Message);
                        }
                    }
                    else
                    {
                        this.adicionarMensagem("É obrigatório o preenchimento de ao menos 1 produto!" + this.produtosSelecionados.Count);
                    }
                }
            }
            else if (acao.Equals("Consultar"))
            {
                if (txtCodigo.Text.Equals(string.Empty) || !Util.Util.getInstance().isInteiro(txtCodigo.Text))
                {
                    this.adicionarMensagem("É necessário o preenchimento do código do pedido!");

                    return;
                }

                try
                {
                    pedido = PedidoBO.getInstance().consultar(new Model.Pedido(int.Parse(txtCodigo.Text)));
                    produtosSelecionados = ItemPedidoBO.getInstance().recuperarProdutosPedido(pedido);

                    this.populaCamposDataGrid(pedido, produtosSelecionados);
                }
                catch (Exception)
                {
                    this.adicionarMensagem("Produto não existe!");
                    this.limparCampos();
                    this.camposHabilitadosConsultar();
                }
            }
            else
            {
                String codigoPedido = txtCodigo.Text;

                if (codigoPedido.Equals(string.Empty) || !Util.Util.getInstance().isInteiro(codigoPedido))
                {
                    this.adicionarMensagem("O campo código deve ser preenchido corretamente!");
                    return;
                }

                try
                {
                    PedidoBO.getInstance().deletar(new Model.Pedido(int.Parse(codigoPedido)));

                    this.adicionarMensagem("Sucesso na exclusão do pedido!");

                    this.limparCampos();
                }
                catch (Exception)
                {
                    this.adicionarMensagem("Pedido não existente");
                }

            }

        }

        private void populaCamposDataGrid(Model.Pedido pedido, List<ItemPedidoVO> items)
        {
            this.txtDescricao.Text = pedido.Descricao;
            this.txtData.Text = pedido.Data.ToString("dd/MM/yyyy");
            this.txtDesconto.Text = String.Format("{0:0.00}", pedido.ValorDesconto);
            this.txtOrcamento.Text = pedido.Orcamento;
            this.lblResultado.Text = String.Format("R$ {0:0.00}", pedido.ValorTotal);

            this.lblValorTotal.Visible = true;
            this.lblResultado.Visible = true;

            this.cmbCliente.SelectedValue = pedido.Cliente.Codigo.ToString();
            this.dtgProdutos.DataSource = items;
            this.dtgProdutos.DataBind();
        }

        private void limparCampos() {
            this.txtCodigo.Text = string.Empty;
            this.txtDescricao.Text = string.Empty;
            this.txtData.Text = string.Empty;
            this.txtDesconto.Text = string.Empty;
            this.txtOrcamento.Text = string.Empty;
            this.txtQuantidade.Text = string.Empty;

            this.cmbCliente.SelectedIndex = 0;
            this.cmbProduto.SelectedIndex = 0;

            this.dtgProdutos.DataSource = null;
            this.dtgProdutos.DataBind();

            this.lblResultado.Text = string.Empty;
        }

        private List<String> validaCamposForm() {
            List<String> erros = new List<String>();
            
            if (this.txtDescricao.Text.Equals(string.Empty)) {
                erros.Add("É obrigatório o preenchimento do campo Descrição!");
            }

            if (this.txtData.Text.Equals(string.Empty)) {
                erros.Add("É obrigatório o preenchimento do campo Data!");
            }

            if(this.txtDesconto.Text.Equals(string.Empty))
            {
                erros.Add("É obrigatório o preenchimento do campo Desconto!");
            }

            if (this.txtOrcamento.Text.Equals(string.Empty)) {
                erros.Add("É obrigatório o preenchimento do campo Orçamento!");
            }
            
            return erros;
        }
    }
}